Runtime 是 iOS 开发中的知名黑魔法,充分体现了 Objective - C 的动态运行时特性,Swift 是一门静态语言,这意味着代码编译时即确定了其实际调用的方法和类型,所以纯粹的 Swift 类和对象没有办法使用 Runtime,更不存在 Method swizzling,但是呢,Swift 是兼容 Objective - C 的,继承自 NSObject 的类,也就具有了运行时的消息机制。
纯粹的 Swift 类,也可以通过添加 @objc
修饰符, @objc
关键字只需要对那些不是继承自 NSObject
的类型进行,如果 class 是继承自 NSObject
的话,Swift 会默认自动为所有的非 private 的类和成员加上 @objc
。
@objc
修饰符主要用于需要暴露给 Objective-C 使用的任何地方 (包括类,属性和方法等) ,以支持其动态派发和运行时机制。
添加 @objc
修饰符并不意味着这个方法或者属性会变成动态派发,Swift 依然可能会将其优化为静态调用。如果需要施展一些像 Method swizzling 或者运行时再决定实现这样的 “黑魔法” 的时候,我们就必须用到 dynamic
修饰符了。 dynamic
修饰符会隐式的添加 @objc
进行修饰。
也就是说,需要 Swift 和 Objective 混合开发时,使用 @objc
就可以了,需要 Swift 完全实现运行时机制时,那么必须要添加 dynamic
修饰符。
下面我们通过优化归解档,来了解 Runtime 在 Swift 中的应用:
|
|
当我们使用归解档,属性很多或者结构很复杂时,会产生很多的重复代码,这时就可以通过 Runtime 来获取类的属性列表,属性名,属性数量等,再通过 KVC 完成取值和赋值,大大简化了这一步骤。
下面是使用方法:
|
|
Runtime 还有很多强大的方法,不仅仅是针对 Class,还有 Method、SEL、Protocol等,我们以后再讲。